import { initMixin } from './init';
import { stateMixin } from './state';
import { renderMixin } from './render';
import { eventsMixin } from './events';
import { lifecycleMixin } from './lifecycle';
import { warn } from '../util/index';

// vue 的构造函数
function Vue(options) {
  if (process.env.NODE_ENV !== 'production' && !(this instanceof Vue)) {
    warn('Vue is a constructor and should be called with the `new` keyword');
  }
  // 调用原型上的 _init 方法
  this._init(options);
}

/**
 * 本文件定义了很多实例方法
 */

// 定义Vue原型上的init方法(内部方法)
initMixin(Vue);

// 定义原型上跟数据相关的属性方法
/**
 * stateMixin方法会定义跟数据相关的属性方法，
 * 例如代理数据的访问，
 * 我们可以在实例上通过this.$data和this.$props访问到data,props的值，
 * 并且也定义了使用频率较高的this.$set,this.$delete等方法。
 */
stateMixin(Vue);

//定义原型上跟事件相关的属性方法
// vm.$on,vm.$once,vm.$off,vm.$emit
eventsMixin(Vue);

// 定义原型上跟生命周期相关的方法
// _update $forceUpdate $destroy
lifecycleMixin(Vue);

//定义原型上跟渲染相关的方法
// $nextTick _render
renderMixin(Vue);

export default Vue;
